// array  TS 中要求数组中的每一项必须是同一个数据类型。
// 语法：
// 变量名: 数组中数据的类型[ ] = 数组值
// 变量名: Array<数组中数据的类型> = 数组值
const arr1: number[] = [1, 2, 3];
const arr2: Array<number> = [1, 2, 3];
const arr3: Array<string> = ['1', '2']
const arr4: Array<number> = [1, 2, '3'] // error 不能将类型“string”分配给类型“number”, 必须是同一个数据类型

//如果想要是数字类型或字符串类型，需要使用 ｜
const arr5: Array<number | string> = [1, 2, '3']

// 元祖   允许一个数组中保存多个类型的数据
// *注意：要求数组中的值与元组类型必须：数量要对应、位置要对应、类型要对应
const arr6: [string, number] = ['1', 2];

//object
// 方式一：
let obj1: object;
obj1 = {
  name:"pengyuyan",
  age:18
};
// 方式二
let obj2: {};
obj2 = {
  name:"pengyuyan",
  age:18
}

// 定义对象时，需要定义出对象中有哪些属性，每一个属性的值是什么类型,指定的属性的个数，多一个属性也不行，少一个属性也不行
const obj3: { age: number, name: string } = { age: 18, name: 'pengyuyan' };

// 如果想指定属性是可选的（可有可无）
let obj4:{
    name:string,
    age?:number
}
obj4 = {
    name:"pengyuyan"
}

// function   声明的函数在调用的时候,参数个数要和声明时候的参数个数保持一致
//没有返回值的函数可以用void声明
// 参数类型定义
const fun1 = (name:string,id:number): void => {
    console.log("我是没有返回值的箭头函数");
};

function fun2(name:string,id:number):void{
    console.log("我是没有返回值的普通函数");
}

//有返回值的箭头函数声明是这样的
// 返回类型注释
const fun3 = (): string => {
    return "pengyuyan=>"
};

//有返回值的普通函数声明是这样的

function fun4():string{
    return "pengyuyan"
}


//函数表达式的双向限定
//上述f1其实只对=右侧做了限制,对左侧并没有
//完善一点,可以这样 => 用来表示函数的定义,左输入类型，需要用括号括起来，右输出类型

const fun5:(name:string,id:number)=>void = (name:string,id:number): void => {
    console.log("我是没有返回值的箭头函数");
};

// 函数的可选参数
// 注意可选参数要在确定参数后
function fun6(name:string,id?:number):string{
    return "pengyuyan"
}

//函数参数默认值
function fun7(name:string,id:number=1):string{
    return `${name}--${age}`
}
//此时可选参数不必一定在确定参数后,但是调用有问题
function fun8(name:string,sex?:string,age:number=1):string{
    return `${name}--${age}--${sex}`
}
console.log(fun8('pengyuyan','male',18))  // "pengyuyan--18--male"

//剩余参数
function fun9(...arr:number[]):number[]{
    return arr
}
console.log(fun9(1,2,3,4,5)) // [1,2,3,4,5]

